/**
 * 提取文本关键词
 * @param text 文本
 * @param topN 关键词数量
 */
export function extractKeywords(text: string, topN = 5) {
  // 1. 清洗文本：支持中文并移除标点符号
  const cleaned = text
    .replace(/[^\p{L}\p{N}\s]/gu, '') // 保留所有语言的字母、数字和空格
    .replace(/\s+/g, ' ')
    .trim();
  if (!cleaned) return [];
  // 2. 使用Intl.Segmenter进行中文分词（现代浏览器原生支持）
  // 由于部分环境可能不支持 Intl.Segmenter，可使用第三方库或条件判断
  // 这里假设环境支持 Intl.Segmenter，添加类型断言解决类型检查问题
  // 它支持三种分词粒度：grapheme（字符）、word（词）、sentence（句子）
  const segmenter = new (Intl as any).Segmenter('zh-CN', { granularity: 'word' });
  const segments = segmenter.segment(cleaned);
  const words = Array.from(segments).map((segment: any) => segment.segment);
  // 3. 统计词频，过滤短词
  const freqMap = {};
  words.forEach(word => {
    // 过滤长度小于2的词，排除纯空格
    const trimmedWord = word.trim();
    if (trimmedWord.length >= 2) {
      (freqMap as Record<string, number>)[trimmedWord] = ((freqMap as Record<string, number>)[trimmedWord] || 0) + 1;
    }
  });
  // 4. 排序并返回高频词
  return Object.entries(freqMap)
    .sort((a: [string, unknown], b: [string, unknown]) => {
      const numA = typeof a[1] === 'number' ? a[1] : 0;
      const numB = typeof b[1] === 'number' ? b[1] : 0;
      return numB - numA;
    })
    .slice(0, topN)
    .map(item => item[0]);
}